package com.alex.jdbc.transaction.service.impl;

import com.alex.jdbc.transaction.dao.BookShopDao;
import com.alex.jdbc.transaction.service.BookShopService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service("bookShopService")
public class BookShopServiceImpl implements BookShopService {

    @Autowired
    private BookShopDao bookshopDao;

    // 添加事务注解: 表明该方法是一次事务(必须没有任何异常后才会提交所有操作至数据库)
    // Propagation.REQUIRES_NEW 即当前的事务方法被另外一个事务方法调用时, 直接使用调用方法的事务, 不再新开事务
    // 使用 propagation 指定事务的传播行为 默认值为 Propagation.REQUIRES_NEW
    // 使用 isolation   指定事务的隔离级别 常用的为 Isolation.READ_COMMITTED

    // 使用 readOnly    指定事务是否为只读
    // 使用 timeout     指定事务强制回滚之前事务占用的时间(单位/秒); 如果事务操作超时会强制回滚,即本次操作不对数据库作任何改变
    // rollbackFor 针对哪些异常进行回滚 一般情况下必须要设置
    @Transactional(propagation = Propagation.REQUIRES_NEW,
            isolation = Isolation.READ_COMMITTED,
            readOnly = false, timeout = 3)
    @Override
    public void purchase(String username, String isbn) {
        int price = bookshopDao.findBookPriceByIsbn(isbn);

        // 更新书的库存
        bookshopDao.updateBookStock(isbn);

        // 更新用户余额
        bookshopDao.updateUserAccount(username, price);
    }
}
